Plain Old Java Object

In computing software, POJO is an acronym for Plain Old Java Object. The name is used to emphasize that a given object is an ordinary Java Object, not a special object. The term was coined by Martin Fowler, Rebecca Parsons and Josh MacKenzie in September 2000:

"We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it's caught on very nicely."[1]

The term "POJO" is mainly used to denote a Java object which does not follow any of the major Java object models, conventions, or frameworks. The term continues the pattern of older terms for technologies that do not use fancy new features, such as POTS (Plain Old Telephone Service) in telephony, and PODS (Plain Old Data Structures) that are defined in C++ but use only C language features, and POD (Plain Old Documentation) in Perl. The equivalent to POJO on the .NET framework is Plain Old CLR Object.

The POJO phenomenon has most likely gained widespread acceptance because of the need for a common and easily understood term that contrasts with complicated object frameworks.

Contents

Definition

Ideally speaking, a POJO is a Java object not bound by any restriction other than those forced by the Java Language Specification. I.e., a POJO should not have to

  1. Extend prespecified classes, as in
    public class Foo extends javax.servlet.http.HttpServlet { ...
    
  2. Implement prespecified interfaces, as in
    public class Bar implements javax.ejb.EntityBean { ...
    
  3. Contain prespecified annotations, as in
    @javax.persistence.Entity public class Baz { ...
    

However, due to technical difficulties and other reasons, many software products or frameworks described as POJO-compliant actually still require the use of prespecified annotations for features such as persistence to work properly. As these features are still technically part of an official java specification (Java EE), the argument can be made that they are still POJOs even though they don't conform to the more commonplace Java SE standard.

Contextual variations

JavaBeans

A JavaBean is a POJO that is serializable, has a no-argument constructor, and allows access to properties using getter and setter methods that follow a simple naming convention. Because of this convention, simple declarative references can be made to the properties of arbitrary JavaBeans. Code using such a declarative reference does not have to know anything about the type of the bean, and the bean can be used with many frameworks without these frameworks having to know the exact type of the bean.

The following shows an example of a JSF component having a bidirectional binding to a POJO's property:

<h:inputText value="#{myBean.someProperty}"/>

The definition of the POJO can be as follows:

public class MyBean {
 
    private String someProperty;
 
    public String getSomeProperty() {
         return someProperty;
    }
 
    public void setSomeProperty(String someProperty) {
        this.someProperty = someProperty;
    }
}

Because of the JavaBean naming conventions the single "someProperty" reference can be automatically translated to the "getSomeProperty()" method for getting a value, and to the "setSomeProperty(String)" method for setting a value.

Transparently adding services

As designs using POJOs have become more commonly used, systems have arisen that give POJOs the full functionality used in frameworks and more choice about which areas of functionality are actually needed. In this model, the programmer creates nothing more than a POJO. This POJO purely focusses on business logic and has no dependencies on (enterprise) frameworks. AOP frameworks then transparently add cross-cutting concerns like persistence, transactions, security, and so on.[2]

Spring was an early implementation of this idea and one of the driving forces behind popularizing this model. [3] [4]

Other examples are:

The following shows a fully functional EJB bean, demonstrating how EJB3 leverages the POJO model:

public class HelloWorldService {
 
    public String sayHello() {
        return "Hello, world!";
    }
}

As given, the bean does not need to extend any EJB class or implement any EJB interface and also does not need to contain any EJB annotations. Instead, the programmer declares in an external xml file which EJB services should be added to the bean:

<enterprise-beans>
    <session>
        <ejb-name>helloWorld</ejb-name>
        <ejb-class>com.example.HelloWorldService</ejb-class>
       <session-type>stateless</session-type>
    </session>
</enterprise-beans>

In practice, some people find annotations elegant, while they see XML as verbose, ugly and hard to maintain, yet others find annotations pollute the POJO model. [5][6][7]

Thus, as an alternative to XML, many frameworks (e.g. Spring, EJB and JPA) allow annotations to be used instead or in addition to XML:

@Stateless
public class HelloWorldService {
 
    public String sayHello() {
        return "Hello, world!";
    }
}

With the annotation as given above the bean isn't a truly pure POJO anymore, but since annotations are merely passive metadata this has far fewer harmful drawbacks compared to the invasiveness of having to extend classes and/or implement interfaces.[8] Accordingly, the programming model is still very much like the pure POJO model.

POJO generation projects

Prevayler 
an open source system prevalence layer that transparently persists POJOs.
BeanExaminer 
framework to present any java objects in an interactive surface to browse and edit them. A generator is included to create the desired POJOs through a given db connection.
Roma Meta Framework 
DDD centric framework. The innovative holistic approach lets the designer/developer to view anything as a POJO: GUI, I18N, Persistence, etc.
OpenXava 
Framework to develop J2EE business applications rapidly and easily. It's based in business components defined with XML. Feature rich and flexible since it's used for years to create business applications. Generates POJO Hibernate EJB2 and EJB3 JPA ...
PlainXML 
Generating POJO by DTD; XML-POJO mapping via Java5 annotations or DTD; XML manipulations using POJO without SAX/DOM; Preprocessing of XML documents using expression language; Binary XML; RMI friendly XML; Exporting to JSON; XML marshall/unmarshall ...
PAT 
AOP (JBossAOP) persistence library (aspect library). Provides persistence layer with underlying Prevayler (1.02). Allows users to write their code without worrying about persistence code (POJO). Uses annotations.
Java O/RM 
This is a Java Object Relational mapping tool that is very simple to use. It works with all major databases and requires only minimal coding effort. JOR strictly follows the POJO / POJI (Plain Old Java Objects / Plain Old Java Interfaces) model.
AutoPersistJ 
This project aims to assist developers in developing java EE persistence layer for existing database tables. It gets metadata of selected database tables and generates classes for them. it uses and extends the ideas of DbGen project to EJB 3.0 POJO.
PojoGen
It is a small tool to generate Java Code (a POJO) for an APPFUSE-based project from a DDL file, which is created from an ER diagram by Microsoft VISIO. It makes an APPFUSE-based project more easy to use.
Pojodbc
An easy-to-use Java Object Relation mapping library without configurations file or annotations. Built on top of JDBC, you still use your optimized native SQL and get POJOs.
Apache Felix iPOJO 
A new type of dynamic service-oriented component runtime that runs pure POJO applications on the top of OSGi platforms. Non-functional (extra-functional) services can be added and removed at runtime.
JBoss Microcontainer
The JBoss Microcontainer is a refactoring of JBoss's JMX Microkernel to support direct POJO deployment and standalone use outside the JBoss application server.
Naked Objects
An open source framework that auto-creates an object-oriented user interface from POJOs using the naked objects pattern.
Metawidget
A 'smart User Interface widget' that populates itself, at runtime, with UI components to match the properties of POJOs.
fbDaoGenerator
Fbdaogenerator connects to a Firebird Database, reads the metadata of the Database by querying the system-tables, and generates POJOs and Data Access Objects.

POJO translation projects

pojo-injector
pojo-injector allows to populate POJOs from Java data models and back (from POJOs to data models, ie interfaces or concrete classes). The translation is based on annotating just only the POJOs classes (Java data models are untouched)

POJO testing projects

OpenPojo
a pluggable testing framework

See also

References

  1. ^ MF Bliki: POJO from MartinFowler.com
  2. ^ Martin, Robert C. (2008). Clean Code. Chapter 11, Pure Java AOP Frameworks
  3. ^ http://what-when-how.com/enterprise-javabeans-3/introducing-the-spring-framework-ejb-3/
  4. ^ http://www.slideshare.net/reynolds/ejb3online-final-060208v2-presentation
  5. ^ Panda, Rahman, Lane. (2007). EJB3 in action. Manning. Chapter 11, Deployment descriptors vs. annotations
  6. ^ http://www.selikoff.net/2008/08/24/ejb3-annotations-vs-xml/
  7. ^ http://www.adam-bien.com/roller/abien/entry/ejb3_annotations_vs_xml_and
  8. ^ Martin, Robert C. (2008). Clean Code. Chapter 11, Pure Java AOP Frameworks